home *** CD-ROM | disk | FTP | other *** search
/ Pascal Super Library / Pascal Super Library (CW International)(1997).bin / FONT_UTL / GRFTXT / GRAFTEX1.ASM < prev    next >
Assembly Source File  |  1993-03-09  |  6KB  |  171 lines

  1. ; GRAFTEXT - Fast text in graphics mode
  2. ;           Gtran - transparent text procedure
  3. ;
  4. ; by Tim Godfrey 72617,2125
  5. ;
  6. ; version 2.0 - 2/19/93  updated for support of protected mode in BP7
  7. ;
  8. data   segment word public
  9.        assume DS:data
  10.        extrn   pitch:WORD     ; number of bytes per scan line
  11.        extrn   Seg0040:word   ; Pmode selector for bios data area
  12.        extrn   SegA000:word   ; Pmode selector for ega/vga graphics page
  13. lpage   dw      ?               ; local Dseg storage for Page offset
  14. data   ends
  15.  
  16. code   segment   byte public
  17. assume  cs:code,ds:data
  18. public    gtran
  19. page 60,132
  20. ;                    val val val     val      VAR    VAR
  21. ; procedure gtran(gdx,gdy,color,fontlines,fontbase,instring);
  22. ; transparent text writing
  23. ;
  24. ; These equates define the BP relative passed parameters
  25. gdx       equ  [BP+18]
  26. gdy       equ  [BP+16]
  27. color     equ  [BP+14]
  28. fontlines equ  [BP+12]
  29. fontbase  equ  [BP+8]
  30. instring  equ  [BP+4]
  31.  
  32. pitchBP   equ  [BP-4]
  33.  
  34. gtran proc    NEAR
  35.  
  36.      push      bp
  37.      mov       bp,sp
  38.      push      ds
  39.      mov       ax,pitch
  40.      push      ax              ; save pitch on stack frame (at bp-4)
  41.                                ;
  42.                                ; Note! Do not add anything that would change
  43.                                ; the stack pointer between this push AX and
  44.                                ; the push BP above without making a
  45.                                ; corresponding change to the pitchBP EQU
  46.  
  47. ; Calculate byte address (segment & offset) and bit mask
  48. ;
  49.      push    ds
  50.      mov     dx,Seg0040         ; bios data segment
  51.      mov     ds,dx
  52.      mov     si,062h
  53.      mov     al,[si]         ; get active display page from BIOS
  54.      or      al,al           ; set flags - only 2 pages possible, 0 and 1
  55.      jz      page0           ; if zero, skip ofset add
  56.      mov     ax,8000h        ; set ax to 8000h for page 1
  57.      jmp     setpage
  58. page0:
  59.      xor     ax,ax           ; clear page offset
  60. setpage:
  61.      mov     lpage,ax        ; page offset value
  62.      pop     ds
  63.  
  64.  
  65.      mov     dx,3CEh         ; Graphics Controller port address
  66.      mov     ax,0205h        ; WriteMode 2, Readmode 0 at index 5
  67.      out     dx,ax           ; select register 5 (mode)
  68.      mov     dx,3C4h         ; Sequencer/Map Mode port address
  69.      mov     ax,0F02h
  70.      out     dx,ax           ; Select "Map Mask" register 2, enable all planes
  71.  
  72. ;
  73.      mov     bx,gdx          ; get X address from stack frame
  74.      shr     bx,1
  75.      shr     bx,1
  76.      shr     bx,1            ; compute memory address ofset  BX := x/8
  77. ;
  78.      les     SI,instring     ; get doulbleword base address of string
  79.      xor     ch,ch           ; clear ch
  80.      mov     cl,byte ptr ES:[si]  ; points to length of string
  81.      or      cl,cl        ; set flags
  82.      jz         nullstring      ; if length is zero, skip everything
  83.  
  84.      mov     ax,gdy          ; get Y address (a pixel row)
  85.      add     ax,fontlines    ; add in lines in font as ofset to Y value
  86.      dec     ax              ; subtract 1 because cx is 1 based inst. of 0
  87.      mov     dx,pitch
  88.      mul     dx              ; AX := (y * 80)  (80 bytes per row)
  89.      add     dx,lpage        ; add in page offset (1/2 of buffer);
  90.      add     ax,bx           ; AX := (y * 80) + x/8          (offset)
  91.  
  92.      mov     di,ax           ; save EGA/VGA memory ofset in DI
  93.                              ;
  94.      mov     dx,SegA000      ; selector to base page of EGA/VGA memory
  95.                              ; note: this variable is in main DS
  96.      mov     ds,dx           ; DS := EGA/VGA buffer segment address
  97.  
  98. ; Get the Graphics Controller address
  99.      mov     dx,3CEh         ; base register (offset has to be 8 for bitmask)
  100.  
  101. strloop:                     ; loop for number of characters in string
  102.      push    CX              ; save string count for outer loop
  103.      inc     SI              ; make si point to nextchar
  104.      mov     bl,byte ptr ES:[SI]      ; SI points to next char - read into bx
  105.      inc     bl              ; increment char code : draw char from bot to top
  106.      mov     ax,fontlines    ; get number of lines/char in font
  107.      mov     cx,ax           ; keep for use as char-loop counter
  108.      mul     bl              ; ax := bl (character) * al (bytes/char)
  109.      mov     bx,ax           ; leave font character ofset in BX
  110.      push    ES              ; save char string seg.
  111.      push    SI              ; save char string pointer
  112.      push    DI              ; save EGA/VGA destination
  113. ;
  114. ; loop for the number of lines
  115. ;
  116.  
  117.      les     SI,fontbase     ; get dblword base address of font
  118. ;
  119.      mov     al,8            ; bit mask index
  120.  
  121.  
  122. charloop:                    ; loop through the font's scanlines bottom to top
  123.  
  124.      dec     bx              ; move UP to next scanline in font
  125.  
  126.      mov     ah,ES:[BX][SI]  ; get bit mask byte from font: bx=font char ofs
  127.      out     dx,ax           ; load the bit mask into reg 8
  128. ;
  129. ; Set bits in the appropriate bit planes by writing color value to EGA/VGA memory
  130.  
  131.      mov     ah,[di]         ; Latch the bit plane data with dummy read
  132.      mov     ah,byte ptr color ; get the color value
  133.      mov     [di],ah         ; Set bits to '1' in appropriate planes.
  134. ;
  135. ;                            ; read pitch from BP stack frame
  136.      sub     di,pitchBP      ; move up one line in EGA/VGA memory
  137.      loop    charloop        ; decrement cx and do next scanline
  138.  
  139.  
  140.  
  141.      pop     DI              ; get back EGA/VGA destination
  142.      inc     DI              ; move screen position to next char over
  143.  
  144.      pop     SI              ; pop character pointer
  145.      pop     ES              ;  "     "      segement
  146.  
  147.      pop     CX              ; get outer loop - counting chars in string
  148.      loop    strloop
  149.  
  150. nullstring:
  151. ; Restore default EGA/VGA graphics status
  152.  
  153.                        ; dx still points to Graphics Controller port address
  154.      mov     ax,0005h        ; write mode=0: read mode=0: index=5
  155.      out     dx,ax           ; select register 5 (mode)
  156.  
  157.      mov     ax,0FF08h        ; reset bitmask register to all on
  158.      out     dx,ax           ; ... Graphics Controller register 8
  159.  
  160.      pop       ax            ; discard pitch value from stack frame
  161.      pop       ds
  162.      pop       bp
  163.      ret       14d
  164.  
  165.  
  166. gtran endp
  167.  
  168. code ends
  169.  
  170.      end
  171.